package shoot.FlyingObject;

import shoot.World;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Objects;
import java.util.Random;

/**
 * @author: dongshipan
 * @date: 2021/7/5 16:04
 * @description: 飞行物父类
 */
public abstract class BaseFlyingObject {

    /**
     * 飞行物默认状态为 LIFI
     */
    protected int state = FlyConstant.LIFE;

    //速度
    /**
     * 飞行物属性 宽
     */
    protected int width;
    /**
     * 飞行物属性 高
     */
    protected int height;
    /**
     * 飞行物属性 x 坐标
     */
    protected int x;
    /**
     * 飞行物属性 y 坐标
     */
    protected int y;


    /**
     * 生成敌军（飞机）的构造方法
     * 给定宽，高
     * 随机x、y坐标
     * 小敌机\大敌机\小蜜蜂
     *
     * @param width 宽
     * @param height 高
     */
    public BaseFlyingObject(int width, int height) {
        Random ran = new Random();
        this.width = width;
        this.height = height;
        y = -height;
        x = ran.nextInt(400 - width);
    }

    /**
     * 生成玩家（飞机）的构造方法
     * // 天空\英雄机\子弹
     *
     * @param width  宽
     * @param height 高
     * @param x      x坐标
     * @param y      y坐标
     */
    public BaseFlyingObject(int width, int height, int x, int y) {
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
    }

    /**
     * 飞行物移动方法 抽象方法
     */
    public abstract void step();

    /**
     * 读取图片
     */
    public static BufferedImage readImage(String fileName) {
        try {
            fileName = String.valueOf(BaseFlyingObject.class.getResource(fileName));
            System.out.println(fileName);
            return ImageIO.read(BaseFlyingObject.class.getResource(fileName));
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }


    /**
     * 每个飞行物都能获得自己的图片，但是具体获得那张图片不知道
     * 所以规定一个抽象方法，让子类自己区获得图片
     */
    public abstract BufferedImage getImage();


    /**
     * 对应三种状态，编写三个判断，判断是否是这个状态
     * 判断活着
     */
    public boolean isLife() {
        return state == FlyConstant.LIFE;
    }

    /**
     * 判断死了
     */
    public boolean isDead() {
        return state == FlyConstant.DEAD;
    }

    /**
     * 判断尸体清除
     */
    public boolean isRemove() {
        return state == FlyConstant.REMOVE;
    }

    /**
     * 将图片绘制到窗体上
     */
    public void paintObject(Graphics g) {
        g.drawImage(getImage(), x, y, null);
    }

    /**
     * 检测越界方法
     */
    public boolean outOfBounds() {
        //如果飞行物的 Y>world.height 视为越界
        return this.y > World.HEIGHT;
    }

    /**
     * 飞行物去死的方法
     */
    public void goDead() {
        // 将当前飞行物的状态该为  DEAD
        state = FlyConstant.DEAD;
    }

    /**
     * 检测飞行物碰撞的方法
     * 当前对象即 this 表示敌机，目标对象是以参数方式传入
     * 参数 other 是子弹或英雄机
     **/
    public boolean hit(BaseFlyingObject other) {
        // x1:敌人的 x-子弹的宽
        int x1 = this.x - other.width;
        // x2:敌人的 x+敌人的宽
        int x2 = this.x + this.width;
        // y1：敌人的 y-子弹的高
        int y1 = this.y - other.height;
        // y2:敌人的 y+敌人的高
        int y2 = this.y + this.height;
        // 子弹的 x;
        int x = other.x;
        // 子弹的 y;
        int y = other.y;
        return x >= x1 && x <= x2 && y >= y1 && y <= y2;
    }


}
